package org.xx.armory.spring5.data;

import java.util.Objects;

import static org.apache.commons.lang3.StringUtils.isBlank;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;
import static org.xx.armory.commons.Validators.rejectIfNegative;
import static org.xx.armory.commons.Validators.rejectIfNonPositive;

/**
 * 分页链接。
 */
public final class PageLink {
    private final String title;
    private final int startRowIndex;
    private final int maximumRows;
    private final boolean current;

    /**
     * 构造分页参数对象。
     *
     * @param title
     *         链接标题。
     * @param startRowIndex
     *         起始记录序号（从0开始）。
     * @param maximumRows
     *         每页记录数。
     * @param currentRowIndex
     *         是否当前页。
     * @throws IllegalArgumentException
     *         如果参数 {@code title} 小于 {@code 0}，或者参数 {@code startRowIndex} 小于 {@code 1}。
     */
    public PageLink(
            String title,
            int startRowIndex,
            int maximumRows,
            int currentRowIndex
    ) {
        if (isBlank(title)) {
            throw new IllegalArgumentException("title cannot be null or empty");
        }
        if (startRowIndex < 0) {
            throw new IllegalArgumentException("startRowIndex cannot less than 0");
        }

        this.title = trimToEmpty(title);
        this.startRowIndex = rejectIfNegative(startRowIndex, "startRowIndex");
        this.maximumRows = rejectIfNonPositive(maximumRows, "maximumRows");
        this.current = currentRowIndex == startRowIndex;
    }

    /**
     * 获取链接标题。
     *
     * @return 链接标题。
     */
    public final String getTitle() {
        return title;
    }

    /**
     * 获取最多记录数。
     *
     * @return 最多记录数。
     */
    public final int getStartRowIndex() {
        return startRowIndex;
    }

    /**
     * 获取每页记录数。
     *
     * @return 每页记录数。
     */
    public final int getMaximumRows() {
        return this.maximumRows;
    }

    /**
     * 判断是否当前页。
     *
     * @return 是否当前页。
     */
    public final boolean isCurrent() {
        return this.current;
    }

    @Override
    public int hashCode() {
        return Objects.hash(this.title, this.startRowIndex, this.maximumRows, this.current);
    }

    @Override
    public boolean equals(
            Object obj
    ) {
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof PageLink)) {
            return false;
        }
        final var other = (PageLink) obj;
        return this.startRowIndex == other.startRowIndex && this.maximumRows == other.maximumRows && this.current == other.current && Objects.equals(this.title, other.title);
    }

    @Override
    public String toString() {
        return "PageLink("
                + "title=" + this.title + ","
                + "startRowIndex=" + this.startRowIndex + ","
                + "maximumRows=" + this.maximumRows + ","
                + "current=" + this.current
                + ")";
    }
}
